﻿Imports System.IO

Public Class CompressorModule
    ReadOnly _data As New Data
    ReadOnly _compressors As New List(Of Compressor)

    Private Sub btnSource_Click(sender As Object, e As EventArgs) Handles btnSource.Click
        Dim source As DialogResult = FolderBrowserDialog.ShowDialog
        If source = DialogResult.OK Then FileTypeDivisor(FolderBrowserDialog.SelectedPath)
    End Sub

    Private Sub FileTypeDivisor(ByVal inputFolder As String)

        Try
            For Each file As String In _
                My.Computer.FileSystem.GetFiles(inputFolder, FileIO.SearchOption.SearchAllSubDirectories)
                _data.addFile(inputFolder, file)
            Next
        Catch ex As Exception
            Debug.WriteLine("ERROR: " & ex.Message)
        End Try

        DivideSource(inputFolder)
        InitializeCompressors()
        Compress()
    End Sub

    Private Sub Compress()
        Dim inStartInfo As New ProcessStartInfo
        inStartInfo.WindowStyle = ProcessWindowStyle.Hidden

        For Each collection In _data.FileTypes
            If (Not Directory.Exists("Temp\" & collection.Type)) Then _
                Directory.CreateDirectory("Temp\" & collection.Type)
            For Each processor In _compressors
                For Each parameter In processor.Parameters
                    inStartInfo.FileName = processor.Executable
                    inStartInfo.Arguments = generateParameter(parameter.Parameters, collection.Type,
                                                              "Temp\" & collection.Type & "\" & parameter.OutputFileName)
                    Process.Start(inStartInfo).WaitForExit()
                Next
            Next
        Next
    End Sub

    Private Function generateParameter(ByVal plantilla As String, ByVal inData As String, ByVal outData As String) _
        As String

        Dim parts() As String = Split(plantilla, "%")
        Dim generatedParameter As String = ""

        For Each part As String In parts
            If part = "in" Then
                generatedParameter += """Temp\" & inData & ".rar"""
            ElseIf part = "out" Then
                generatedParameter += """" & outData & """"
            Else
                generatedParameter += part
            End If
        Next

        Return generatedParameter
    End Function

    Private Sub DivideSource(ByVal source As String)
        Dim inStartInfo As New ProcessStartInfo
        inStartInfo.WindowStyle = ProcessWindowStyle.Hidden

        If (Not Directory.Exists("Temp")) Then Directory.CreateDirectory("Temp")
        For Each collection As FileType In _data.FileTypes
            inStartInfo.FileName = "rar.exe"
            inStartInfo.Arguments = "a -m0 -r -ep1 ""Temp\" & collection.Type & ".rar"" """ & source & "\*" & collection.Type & """"
            Process.Start(inStartInfo).WaitForExit()
        Next
    End Sub

    Private Sub InitializeCompressors()
        Dim winRar As Compressor = New Compressor("WinRar", "rar.exe")
        winRar.addProcessingParameters("a -m1 -ma5 %out% %in%", "rar m1 ma5.rar")
        winRar.addProcessingParameters("a -m2 -ma5 %out% %in%", "rar m2 ma5.rar")
        winRar.addProcessingParameters("a -m3 -ma5 %out% %in%", "rar m3 ma5.rar")
        winRar.addProcessingParameters("a -m4 -ma5 %out% %in%", "rar m4 ma5.rar")
        winRar.addProcessingParameters("a -m5 -ma5 %out% %in%", "rar m5 ma5.rar")
        winRar.addProcessingParameters("a -m1 -ma4 %out% %in%", "rar m1 ma4.rar")
        winRar.addProcessingParameters("a -m2 -ma4 %out% %in%", "rar m2 ma4.rar")
        winRar.addProcessingParameters("a -m3 -ma4 %out% %in%", "rar m3 ma4.rar")
        winRar.addProcessingParameters("a -m4 -ma4 %out% %in%", "rar m4 ma4.rar")
        winRar.addProcessingParameters("a -m5 -ma4 %out% %in%", "rar m5 ma4.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcT %out% %in%", "rar m1 ma5 mcT.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcT %out% %in%", "rar m2 ma5 mcT.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcT %out% %in%", "rar m3 ma5 mcT.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcT %out% %in%", "rar m4 ma5 mcT.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcT %out% %in%", "rar m5 ma5 mcT.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcT %out% %in%", "rar m1 ma4 mcT.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcT %out% %in%", "rar m2 ma4 mcT.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcT %out% %in%", "rar m3 ma4 mcT.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcT %out% %in%", "rar m4 ma4 mcT.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcT %out% %in%", "rar m5 ma4 mcT.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcE %out% %in%", "rar m1 ma5 mcE.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcE %out% %in%", "rar m2 ma5 mcE.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcE %out% %in%", "rar m3 ma5 mcE.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcE %out% %in%", "rar m4 ma5 mcE.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcE %out% %in%", "rar m5 ma5 mcE.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcE %out% %in%", "rar m1 ma4 mcE.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcE %out% %in%", "rar m2 ma4 mcE.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcE %out% %in%", "rar m3 ma4 mcE.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcE %out% %in%", "rar m4 ma4 mcE.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcE %out% %in%", "rar m5 ma4 mcE.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcI %out% %in%", "rar m1 ma5 mcI.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcI %out% %in%", "rar m1 ma5 mcI.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcA %out% %in%", "rar m1 ma5 mcA.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcA %out% %in%", "rar m1 ma5 mcA.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcC %out% %in%", "rar m1 ma5 mcC.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcC %out% %in%", "rar m1 ma5 mcC.rar")

        winRar.addProcessingParameters("a -m1 -ma5 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m2 -ma5 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m3 -ma5 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m4 -ma5 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m5 -ma5 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m1 -ma4 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m2 -ma4 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m3 -ma4 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m4 -ma4 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        winRar.addProcessingParameters("a -m5 -ma4 -mcD %out% %in%", "rar m1 ma5 mcD.rar")
        _compressors.Add(winRar)

        Dim nanoZip As New Compressor("NanoZip", "nz.exe")
        nanoZip.addProcessingParameters("a -cn %out% %in%", "nz cn.nz")
        nanoZip.addProcessingParameters("a -cf %out% %in%", "nz cf_A.nz")
        nanoZip.addProcessingParameters("a -cF %out% %in%", "nz cF_B.nz")
        nanoZip.addProcessingParameters("a -cd %out% %in%", "nz cd_A.nz")
        nanoZip.addProcessingParameters("a -cdp %out% %in%", "nz cdp_A.nz")
        nanoZip.addProcessingParameters("a -cdP %out% %in%", "nz cdP_B.nz")
        nanoZip.addProcessingParameters("a -cD %out% %in%", "nz cD_B.nz")
        nanoZip.addProcessingParameters("a -cDp %out% %in%", "nz cDp_C.nz")
        nanoZip.addProcessingParameters("a -cDP %out% %in%", "nz cDP_D.nz")
        nanoZip.addProcessingParameters("a -co %out% %in%", "nz co_A.nz")
        nanoZip.addProcessingParameters("a -cO %out% %in%", "nz cO_B.nz")
        nanoZip.addProcessingParameters("a -cc %out% %in%", "nz cc.nz")
        _compressors.Add(nanoZip)

        Dim freeArc As New Compressor("FreeArc", "arc.exe")
        freeArc.addProcessingParameters("a -m1 %out% %in%", "arc m1.arc")
        freeArc.addProcessingParameters("a -m2 %out% %in%", "arc m2.arc")
        freeArc.addProcessingParameters("a -m3 %out% %in%", "arc m3.arc")
        freeArc.addProcessingParameters("a -m4 %out% %in%", "arc m4.arc")
        freeArc.addProcessingParameters("a -m5 %out% %in%", "arc m5.arc")
        freeArc.addProcessingParameters("a -m6 %out% %in%", "arc m6.arc")
        freeArc.addProcessingParameters("a -m7 %out% %in%", "arc m7.arc")
        freeArc.addProcessingParameters("a -m8 %out% %in%", "arc m8.arc")
        freeArc.addProcessingParameters("a -m9 %out% %in%", "arc m9.arc")
        freeArc.addProcessingParameters("a -m1x %out% %in%", "arc m1x.arc")
        freeArc.addProcessingParameters("a -m2x %out% %in%", "arc m2x.arc")
        freeArc.addProcessingParameters("a -m3x %out% %in%", "arc m3x.arc")
        freeArc.addProcessingParameters("a -m4x %out% %in%", "arc m4x.arc")
        freeArc.addProcessingParameters("a -m5x %out% %in%", "arc m5x.arc")
        freeArc.addProcessingParameters("a -m6x %out% %in%", "arc m6x.arc")
        freeArc.addProcessingParameters("a -m7x %out% %in%", "arc m7x.arc")
        freeArc.addProcessingParameters("a -m8x %out% %in%", "arc m8x.arc")
        freeArc.addProcessingParameters("a -m9x %out% %in%", "arc m9x.arc")
        _compressors.Add(freeArc)

        Dim sevenZip As New Compressor("7z", "7z.exe")
        sevenZip.addProcessingParameters("a -m0=LZMA %out% %in%", "7z m0 LZMA.7z")
        sevenZip.addProcessingParameters("a -m1=LZMA %out% %in%", "7z m1 LZMA.7z")
        sevenZip.addProcessingParameters("a -m3=LZMA %out% %in%", "7z m3 LZMA.7z")
        sevenZip.addProcessingParameters("a -m5=LZMA %out% %in%", "7z m5 LZMA.7z")
        sevenZip.addProcessingParameters("a -m7=LZMA %out% %in%", "7z m7 LZMA.7z")
        sevenZip.addProcessingParameters("a -m9=LZMA %out% %in%", "7z m9 LZMA.7z")

        sevenZip.addProcessingParameters("a -m0=PPMd %out% %in%", "7z m0 PPMd.7z")
        sevenZip.addProcessingParameters("a -m1=PPMd %out% %in%", "7z m1 PPMd.7z")
        sevenZip.addProcessingParameters("a -m3=PPMd %out% %in%", "7z m3 PPMd.7z")
        sevenZip.addProcessingParameters("a -m5=PPMd %out% %in%", "7z m5 PPMd.7z")
        sevenZip.addProcessingParameters("a -m7=PPMd %out% %in%", "7z m7 PPMd.7z")
        sevenZip.addProcessingParameters("a -m9=PPMd %out% %in%", "7z m9 PPMd.7z")

        sevenZip.addProcessingParameters("a -m0=Deflate %out% %in%", "7z m0 Deflate.7z")
        sevenZip.addProcessingParameters("a -m1=Deflate %out% %in%", "7z m0 Deflate.7z")
        sevenZip.addProcessingParameters("a -m3=Deflate %out% %in%", "7z m0 Deflate.7z")
        sevenZip.addProcessingParameters("a -m5=Deflate %out% %in%", "7z m0 Deflate.7z")
        sevenZip.addProcessingParameters("a -m7=Deflate %out% %in%", "7z m0 Deflate.7z")
        sevenZip.addProcessingParameters("a -m9=Deflate %out% %in%", "7z m0 Deflate.7z")

        sevenZip.addProcessingParameters("a -m0=Deflate64 %out% %in%", "7z m0 Deflate64.7z")
        sevenZip.addProcessingParameters("a -m1=Deflate64 %out% %in%", "7z m0 Deflate64.7z")
        sevenZip.addProcessingParameters("a -m3=Deflate64 %out% %in%", "7z m0 Deflate64.7z")
        sevenZip.addProcessingParameters("a -m5=Deflate64 %out% %in%", "7z m0 Deflate64.7z")
        sevenZip.addProcessingParameters("a -m7=Deflate64 %out% %in%", "7z m0 Deflate64.7z")
        sevenZip.addProcessingParameters("a -m9=Deflate64 %out% %in%", "7z m0 Deflate64.7z")

        sevenZip.addProcessingParameters("a -m0=BZip2 %out% %in%", "7z m0 BZip2.7z")
        sevenZip.addProcessingParameters("a -m1=BZip2 %out% %in%", "7z m0 BZip2.7z")
        sevenZip.addProcessingParameters("a -m3=BZip2 %out% %in%", "7z m0 BZip2.7z")
        sevenZip.addProcessingParameters("a -m5=BZip2 %out% %in%", "7z m0 BZip2.7z")
        sevenZip.addProcessingParameters("a -m7=BZip2 %out% %in%", "7z m0 BZip2.7z")
        sevenZip.addProcessingParameters("a -m9=BZip2 %out% %in%", "7z m0 BZip2.7z")

        sevenZip.addProcessingParameters("a -m0=BCJ %out% %in%", "7z m0 BCJ.7z")
        sevenZip.addProcessingParameters("a -m1=BCJ %out% %in%", "7z m0 BCJ.7z")
        sevenZip.addProcessingParameters("a -m3=BCJ %out% %in%", "7z m0 BCJ.7z")
        sevenZip.addProcessingParameters("a -m5=BCJ %out% %in%", "7z m0 BCJ.7z")
        sevenZip.addProcessingParameters("a -m7=BCJ %out% %in%", "7z m0 BCJ.7z")
        sevenZip.addProcessingParameters("a -m9=BCJ %out% %in%", "7z m0 BCJ.7z")

        sevenZip.addProcessingParameters("a -m0=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        sevenZip.addProcessingParameters("a -m1=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        sevenZip.addProcessingParameters("a -m3=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        sevenZip.addProcessingParameters("a -m5=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        sevenZip.addProcessingParameters("a -m7=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        sevenZip.addProcessingParameters("a -m9=BCJ2 %out% %in%", "7z m0 BCJ2.7z")
        _compressors.Add(sevenZip)
    End Sub

    Private Sub CompressorModule_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class
